home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / wtjmarch.zip / WINSORT.ZIP / WINSORT.C
Text File  |  1992-02-21  |  5KB  |  178 lines

  1. /****keyword-flag*** "%v %f %n" */
  2. #define WINAPP 1
  3. #if WINAPP == 1
  4. #include <windows.h>
  5. #else
  6. extern int _stklen = 32000;
  7. #endif
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <alloc.h>
  12. #include <string.h>
  13. #include <bcdconv.h>
  14.  
  15. #define ASCII_ZIP_LENGTH 5
  16. #define ASCII_PLUS4_LENGTH 4
  17. #define ASCII_RECNUM_LENGTH 6
  18. #define ASCII_REC_LENGTH (ASCII_ZIP_LENGTH + 1 + \
  19.   ASCII_PLUS4_LENGTH + 1 + ASCII_RECNUM_LENGTH + 2)
  20. #define BCD_ZIP_LENGTH ((ASCII_ZIP_LENGTH+1+ASCII_PLUS4_LENGTH)/2)
  21. #define BCD_RECNUM_LENGTH (ASCII_RECNUM_LENGTH/2)
  22.  
  23. typedef struct
  24. {
  25.   char zip[BCD_ZIP_LENGTH];
  26.   char recnum[BCD_RECNUM_LENGTH];
  27. } SortRecord;
  28.  
  29. typedef struct
  30. {
  31.   char zip[ASCII_ZIP_LENGTH];
  32.   char filler1;
  33.   char plus4[ASCII_PLUS4_LENGTH];
  34.   char filler2;
  35.   char recnum[ASCII_RECNUM_LENGTH];
  36.   char filler3[2];
  37. } AsciiRecord;
  38.  
  39. void Megasort(unsigned SortRecord huge *NumArray,unsigned long
  40. ArraySize,unsigned KeyLength);
  41.  
  42. #define ITEM_COUNT 100
  43.  
  44. #if WINAPP == 1
  45.   int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR
  46. lpszCmdLine,     int cmdShow) #else
  47.   main(int argc, char **argv[])
  48. #endif
  49. {
  50.   unsigned SortRecord huge * RecArray;
  51.   long RecordCount;
  52.   long i;
  53.   char * CmdLine;
  54.   char * BlankPos;
  55.   char * InFileName;
  56.   char * OutFileName;
  57.   FILE *InFile;
  58.   FILE *OutFile;
  59.   BCD zip;
  60.   BCD recnum;
  61.   AsciiRecord ascii_temp_rec[ITEM_COUNT];
  62.   char temp_zip[ASCII_ZIP_LENGTH+ASCII_PLUS4_LENGTH+1+1];
  63.   char ascii_zip[ASCII_ZIP_LENGTH+1+ASCII_PLUS4_LENGTH+1];
  64.   char ascii_recnum[ASCII_RECNUM_LENGTH+1];
  65.   int item;
  66.   InFileName = getenv("WINSORT_IN");
  67.   OutFileName = getenv("WINSORT_OUT");
  68.   InFile = fopen(InFileName,"rb");
  69.   setvbuf(InFile,NULL,_IOFBF,32000);
  70.   fseek(InFile,0,SEEK_END);
  71.   RecordCount = ftell(InFile)/ASCII_REC_LENGTH;
  72.   fseek(InFile,0,SEEK_SET);
  73.   RecArray = (unsigned SortRecord huge
  74. *)farcalloc(RecordCount,sizeof(SortRecord));   for (i = 0; i <
  75. RecordCount; i ++)
  76.     {
  77.     item = i % ITEM_COUNT;
  78.     if (item == 0)
  79.        fread((char
  80. *)&ascii_temp_rec,sizeof(AsciiRecord),ITEM_COUNT,InFile);    
  81. strcpy(temp_zip,"0");
  82.     memcpy(temp_zip+1,ascii_temp_rec[item].zip,ASCII_ZIP_LENGTH); 
  83.   
  84. memcpy(temp_zip+1+ASCII_ZIP_LENGTH,ascii_temp_rec[item].plus4,ASC
  85. II_PLUS4_LENGTH);    
  86. ascii_to_BCD(RecArray[i].zip,temp_zip,ASCII_ZIP_LENGTH+ASCII_PLUS
  87. 4_LENGTH);    
  88. ascii_to_BCD(RecArray[i].recnum,ascii_temp_rec[item].recnum,ASCII
  89. _RECNUM_LENGTH);     }
  90.   fclose(InFile);
  91.  
  92.   Megasort(RecArray,RecordCount,BCD_ZIP_LENGTH);
  93.  
  94.   OutFile = fopen(OutFileName,"wb");
  95.   setvbuf(OutFile,NULL,_IOFBF,32000);
  96.   for (item = 0; item < 10; item ++)
  97.     {
  98.     ascii_temp_rec[item].filler1 = '-';
  99.     ascii_temp_rec[item].filler2 = ' ';
  100.     strncpy(ascii_temp_rec[item].filler3,"\r\n",2);
  101.     }
  102.   for (i = 0; i < RecordCount; i ++)
  103.     {
  104.     item = i % ITEM_COUNT;
  105.    
  106. BCD_to_ascii(ascii_zip,RecArray[i].zip,ASCII_ZIP_LENGTH+ASCII_PLU
  107. S4_LENGTH+1);    
  108. BCD_to_ascii(ascii_recnum,RecArray[i].recnum,ASCII_RECNUM_LENGTH); 
  109.    strncpy(ascii_temp_rec[item].zip,ascii_zip,ASCII_ZIP_LENGTH);  
  110.  
  111. strncpy(ascii_temp_rec[item].plus4,ascii_zip+ASCII_ZIP_LENGTH,ASC
  112. II_PLUS4_LENGTH);    
  113. strncpy(ascii_temp_rec[item].recnum,ascii_recnum,ASCII_RECNUM_LEN
  114. GTH);     if (item == ITEM_COUNT - 1)
  115.        fwrite((char
  116. *)&ascii_temp_rec,sizeof(AsciiRecord),ITEM_COUNT,OutFile);     }
  117.   if (item != ITEM_COUNT - 1)
  118.     fwrite((char
  119. *)&ascii_temp_rec,sizeof(AsciiRecord),item+1,OutFile);  
  120. fclose(OutFile);
  121.   farfree((unsigned SortRecord far *)RecArray);
  122. #if WINAPP == 1
  123.   ExitWindows(0,0);
  124. #endif
  125. }
  126.  
  127. void Megasort(unsigned SortRecord huge *RecArray,unsigned long
  128. ArraySize, unsigned KeyLength) {
  129.   unsigned char  m;
  130.   int   cum;
  131.   int i;
  132.   long j;
  133.   long  BucketCount [ 256 ];
  134.   long  BucketPosition[ 256 ];
  135.   unsigned SortRecord huge *TempRecArray;
  136.   unsigned SortRecord huge *Exchange;
  137.   unsigned long ArrayIndex;
  138.   TempRecArray = (unsigned SortRecord huge *)
  139.   farmalloc (sizeof(SortRecord) * ArraySize);
  140.   if (TempRecArray == NULL)
  141.     {
  142.     exit(1);
  143.     }
  144.   for (i = KeyLength-1; i >= 0; i--)
  145.     {
  146.     _fmemset(BucketCount,0,256*sizeof(long));
  147.     for (j = 0; j < ArraySize; j++)
  148.        {
  149.        m = *((char huge *)&RecArray[ j ]+i);
  150.        ++BucketCount[m];
  151.        }
  152.     BucketPosition[0] = 0;
  153.     for (cum = 1; cum < 256; cum++)
  154.        BucketPosition[ cum ] = BucketCount[ cum-1 ] +
  155.        BucketPosition[ cum-1 ];
  156.     for (j = 0; j < ArraySize; j++)
  157.        {
  158.        m = *((char huge *)&RecArray[ j ]+i);
  159.        ArrayIndex = BucketPosition[m];
  160.        TempRecArray[ArrayIndex] = RecArray[j];
  161.        ++BucketPosition[m];
  162.        }
  163.     Exchange = RecArray;
  164.     RecArray = TempRecArray;
  165.     TempRecArray = Exchange;
  166.     }
  167.   if (KeyLength % 2 != 0)
  168.     {
  169.     for (i = 0; i < ArraySize; i ++)
  170.        {
  171.        _fmemcpy((char far *)&TempRecArray[i],(char far
  172. *)&RecArray[i],sizeof(SortRecord));        }
  173.     farfree((unsigned SortRecord far *)RecArray);
  174.     }
  175.   else
  176.     farfree((unsigned SortRecord far *)TempRecArray);
  177. }
  178.